
#ifndef _LQ_PID_H_
#define _LQ_PID_H_

#include <stdint.h>

// PID控制器类型枚举
typedef enum {
    PID_POSITION = 0,  // 位置式PID
    PID_INCREMENTAL    // 增量式PID
} PidType;

// PID参数结构体
typedef struct {
    float kp;         // 比例系数
    float ki;         // 积分系数
    float kd;         // 微分系数
    float imax;       // 积分限幅值
    
    // 新增抗积分饱和参数
    float out_min;    // 输出最小值
    float out_max;    // 输出最大值
    
    // 内部计算变量
    float out_p;      // 比例项输出
    float out_i;      // 积分项输出
    float out_d;      // 微分项输出
    float out;        // 总输出
    
    float integrator; // 积分累加值
    float last_error; // 上次误差
    float last_derivative; // 上次微分值
    uint32_t last_t;  // 上次计算时间(ms)
} pid_param_t;

void PidInit(pid_param_t *pid);

float constrain_float(float amt, float low, float high);

float PidLocCtrl(pid_param_t *pid, float error);

float PidIncCtrl(pid_param_t *pid, float error);

// 新增PID重置函数
void PidReset(pid_param_t *pid);

// 新增PID参数设置函数
void PidSetTunings(pid_param_t *pid, float kp, float ki, float kd);

#endif /* _LQ_PID_H_ */
